#define _CRT_SECURE_NO_WARNINGS 1
#include"queue.h"

//把指针放在结构体中，传结构体的地址过去就可以改变指针的地址
// 不需要传二级指针

//初始化
void QueueInit(Queue* pq)
{
	assert(pq);
	pq->_head = NULL;
	pq->_tail = NULL;
}
//销毁
void QueueDestory(Queue* pq)
{
	assert(pq); 
	QueueNode* cur = pq->_head;
	while (cur)
	{
		QueueNode* next = cur->_next;
		free(cur);
		cur = next;
	}
	pq->_head = pq->_tail = NULL;
}
//入队（尾入）
void QueuePush(Queue* pq, QDataType x)
{
	assert(pq);
	//开辟
	QueueNode* newnode = (QueueNode*)malloc(sizeof(QueueNode));
	if (newnode == NULL)
	{
		perror("newnode:");
		return -1;
	}
	newnode->_data = x;
	newnode->_next = NULL;

	//判断如果为空链表时
	if (pq->_head == NULL)
	{
		pq->_head = pq->_tail = newnode;
	}
	else
	{
		pq->_tail->_next = newnode;
		pq->_tail = newnode;
	}
}
//出队（头出）
void QueuePop(Queue* pq)
{
	assert(pq);
	assert(pq->_head);
	if (pq->_head)
	{
		QueueNode* next = pq->_head->_next;
		free(pq->_head);
		pq->_head = next;
	}
	else
	{
		//当pq->_head为空时，此时说明链表为空
		//把尾也置空就行
		pq->_tail = NULL;
	}
}
//取队头的数据
QDataType QueueFront(Queue* pq)
{
	assert(pq);
	assert(pq->_head);
	return pq->_head->_data;
}
//取队尾的数据
QDataType QueueBack(Queue* pq)
{
	assert(pq);
	assert(pq->_head);
	return pq->_tail->_data;
}
//清空--返回1是空，返回0是非空
int QueueEmpty(Queue* pq)
{
	assert(pq);
	return pq->_head == NULL ? 1 : 0;
}
//获取数据个数
//是一个O（N）的接口
int	QueueSize(Queue* pq)
{
	assert(pq);
	QueueNode* cur = pq->_head;
	int size = 0;
	while (cur)
	{
		size++;
		cur = cur->_next;
	}
	return size;
}